import numpy as np
import pandas as pd

"""
题目1：学生成绩统计
创建一个包含10名学生数学成绩的Series，成绩范围在50-100之间。
计算平均分、最高分、最低分，并找出高于平均分的学生人数。
"""
np.random.seed(42)
scores = pd.Series(np.random.randint(50, 101, 10), index=[('S_' + str(i)) for i in range(1, 11)], name="成绩表")
print(scores)
print(scores.describe())
print(scores.describe()['mean'])
print("平均分：", scores.mean())
print("最高分：", scores.max())
print("最低分：", scores.min())
print(scores[scores > scores.mean()])
print(len(scores[scores > scores.mean()]))
print(scores[scores > scores.mean()].count())


"""
题目2：温度数据分析
给定某城市一周每天的最高温度Series，完成以下任务:
找出温度超过30度的天数
计算平均温度
将温度从高到低排序
找出温度变化最大的两天
"""
temperatures = pd.Series([28, 31, 29, 32, 30, 27, 33], index=['周一', '周二', '周三', '周四', '周五', '周六', '周日'])
print("超过30度的天数: ", temperatures[temperatures > 30].count())
print("平均温度: ", temperatures.mean())
print("温度从高到低排序: \n", temperatures.sort_values(ascending=False))
t = temperatures.diff().abs().sort_values(ascending=False)
print("温度变化最大的两天: \n", t.head(2))


"""
题目3：股票价格分析
给定某股票连续10个交易日的收盘价Series:
计算每日收益率(当日收盘价/前日收盘价-1)
找出收益率最高和最低的日期
计算波动率(收益率的标准差)
"""
prices = pd.Series([102.3, 103.5, 105.1, 104.8, 106.2, 107.0, 106.5, 108.1, 109.3, 110.2],
                   index=pd.date_range("2023-01-01", periods=10))
print(prices)
r = prices.pct_change()
print("每日收益率：\n", r)
print("收益率最高的日期：", r.idxmax())
print("收益率最低的日期：", r.idxmin())
print("波动率：", r.std())


"""
题目4：销售数据分析
某产品过去12个月的销售量Series:
计算季度平均销量(每3个月为一个季度)
找出销量最高的月份
计算月环比增长率
找出连续增长超过2个月的月份
"""
sales = pd.Series([120, 135, 145, 160, 155, 170, 180, 175, 190, 200, 210, 220],
                  index=pd.date_range('2020-01-01', periods=12, freq='ME'))
print(sales)
print("季度平均销量: \n", sales.resample('QE').mean())
print("销量最高的月份: ", sales.idxmax())
print("月环比增长率: \n", sales.pct_change())
b = sales.pct_change() > 0
print("连续增长超过2个月的月份: ", b[b.rolling(3).sum() == 3].keys())


"""
题目5：每小时销售数据分析
某商店每小时销售额Series:
按天重采样计算每日总销售额
计算每天营业时间(8:00-22:00)和非营业时间的销售额比例
找出销售额最高的3个小时
"""
np.random.seed(42)
hourly_sales = pd.Series(np.random.randint(0, 100, 24),
                         index=pd.date_range('2025-01-01', periods=24, freq='h'))
print(hourly_sales)
day_sales = hourly_sales.resample('D')
print("日总销售额: ", day_sales)
# hourly_sales.between_time('8:00', '22:00')  # 筛选一段时间内的series
open_time_sales = hourly_sales.between_time('8:00', '22:00')
print("营业时间和非营业时间的销售额比例: ", open_time_sales.sum() / (day_sales.sum() - open_time_sales.sum()))

non_open_time_sales = hourly_sales.drop(open_time_sales.index)
print("营业时间和非营业时间的销售额比例: ", open_time_sales.sum() / non_open_time_sales.sum())

open_time_sales = hourly_sales[(hourly_sales.index.hour >= 8) & (hourly_sales.index.hour <= 22)].sum()
print("营业时间和非营业时间的销售额比例: ", open_time_sales.sum() / (day_sales.sum() - open_time_sales.sum()))




